#ifndef __USART_CONFIG_H
#define __USART_CONFIG_H

#include "stm32f10x.h"
#include "freertos.h"
#include "task.h"
#include "queue.h"

#include <stdio.h>
#include <stdarg.h>
#include <string.h>  // 包含strcmp()的声明
#include <stdint.h>  // 保证uint8_t类型定义

#include "ESP01s_Control.h"

#define MAX_STR_LEN 128								// 字符串长度
extern QueueHandle_t xQueue;						// 此处需要声明，避免重复定义

// USART结构体
typedef struct {
    USART_TypeDef* USARTx;      	// 硬件寄存器指针
    GPIO_TypeDef* GPIOx;         	// 对应GPIO组
    uint16_t TX_Pin;            	// TX引脚号
    uint16_t RX_Pin;             	// RX引脚号
    uint32_t BaudRate;           	// 波特率
    char name[8];                	// 串口名称（调试用）
} USART_Config;

// USART对象
extern USART_Config USART1_Cfg;	
extern USART_Config USART2_Cfg;	
extern USART_Config USART3_Cfg;	

typedef enum{
    DEVICE_USART = 0,
    DEVICE_LED = 1,
    DEVICE_BUZZER = 2,
}DeviceID_t;

// 消息结构体
typedef struct {
    uint8_t source_id;  			// 标识USART来源：1=USART1, 2=USART2, 3=USART3
	DeviceID_t device_id;
    uint8_t data[MAX_STR_LEN];   	// 数据缓冲区（按需调整大小）
    uint8_t len;       				// 实际数据长度
} USART_Message_t;

// 初始化
void USART_Pin_Init(const USART_Config *cfg);
void USART_ClearRDR(const USART_Config *cfg);

// 发送信息
void USART_SendByte(const USART_Config *cfg, uint8_t Byte);
void USART_SendString(const USART_Config *cfg, const char *str);
void USART_printf(const USART_Config *cfg, const char *format, ...);

// 接受信息
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
void USART3_IRQHandler(void);
void USART_NVIC_Init(const USART_Config *cfg);

#endif
